package com.kongwg.team.service;

import org.junit.runner.Describable;

import com.kongwg.team.domain.Architect;
import com.kongwg.team.domain.Designer;
import com.kongwg.team.domain.Employee;
import com.kongwg.team.domain.Programmer;

public class TeamService {
	private static int counter=1;//用来为开发团队新增成员自动生成团队中的唯一ID，即memberId。（提示：应使用增1的方式）
	private final int MAX_MEMBER=5;//表示开发团队最大成员数
	private int total=0;//记录开发团队中实际的人数
	private Programmer[] team= new Programmer[MAX_MEMBER];
	
	
	
	/**
	 * 返回当前团队的所有对象
	 * @return包含所有成员对象的数组，数组大小与成员人数一致
	 */
	public Programmer[] getTeam(){
		Programmer[] team = new Programmer[total];
		for(int i = 0; i<team.length;i++){
			team[i] = this.team[i];
		}
		return team;
	}
	
	/**
	 * 向团队中添加成员
	 * @param e
	 * @throws TeamException 
	 */
	public void addMember(Employee e) throws TeamException{
//		失败信息包含以下几种：
//		成员已满，无法添加
		if(total>MAX_MEMBER){
			throw new TeamException("成员已满，无法添加");
		}
//		该成员不是开发人员，无法添加
		if(!(e instanceof Employee)){
			throw new TeamException("该成员不是开发人员，无法添加");
		}
//		该员工已在本开发团队中
		if(isExit(e)){
			throw new TeamException("该员工已在本开发团队中");
		}
//		该员工已是某团队成员 
//		该员正在休假，无法添加
		Programmer p = (Programmer)e;
		if("FREE".equals(p.getStatus())){
			throw new TeamException("该员工已是某团队成员");
		}else if("VOCATION".equals(p.getStatus())){
			throw new TeamException("该员正在休假，无法添加");
		}
//		团队中至多只能有一名架构师
//		团队中至多只能有两名设计师
//		团队中至多只能有三名程序员
		int numOfArch=0,numOfDesi=0,numOfPro=0;
		for(int i =0;i<total;i++){
			if(team[i] instanceof Architect){
				numOfArch++;
			}else if(team[i] instanceof Designer){
				numOfDesi++;
			}else if(team[i] instanceof Programmer){
				numOfPro++;
			}
		}
		
		if(p instanceof Architect){
			if(numOfArch > 1){
				throw new TeamException("团队中至多只能有一名架构师");
			}
		}else if(p instanceof Designer){
			if(numOfDesi > 2){
				throw new TeamException("团队中至多只能有两名设计师");
			}
		}else if(p instanceof Programmer){
			if (numOfPro > 3) {
				throw new TeamException("团队中至多只能有三名程序员");
			}
		}
		
		//将数据加到team数组内
		team[total++] = p;
		//将员工状态变成BUSY
		p.setStatus(Status.BUSY);
		p.setMemberId(counter++);
		
		
		
	}
	
	
	//判断员工是否在本团队中
	private boolean isExit(Employee e) {
		for(int i = 0; i<total;i++){
				return team[i].getId() == e.getId();	
		}
		return false;
	}

	/**
	 * 从团队中删除成员
	 * @param memberId
	 * @throws TeamException 
	 */
	public void removeMember(int memberId) throws TeamException{
		int i=0;
		for(;i<total;i++){
			if(team[i].getMemberId() == memberId){
				team[i].setStatus(Status.FREE);
				break;
			}
		}
		//如果没找到的话，i=total；
		if(i == total){
			throw new TeamException("未找到指定成员");
		}
		
		//找到成员进行覆盖
		for(int j = i+1;j<total;j++){
			team[j-1] = team[j];
		}
		
		//将total设置为空在--；
		team[--total] = null;
	}
}
